package cn.edu.fzu.homemaking.util;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

import cn.edu.fzu.homemaking.exception.ServiceException;
import cn.edu.fzu.homemaking.web.RetCode;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import cn.edu.fzu.homemaking.common.PageVO;
import cn.edu.fzu.homemaking.web.Result;

/**
 * @author yifan
 * @date 2023/4/7
 */
public class ResultUtil {

    /**
     * 解析 Result 对象中的数据
     */
    public static <T> T parseValue(Result result, Class<T> cls) {
        if (result.getCode() != RetCode.SUCCESS) {
            throw new ServiceException(result.getMessage());
        }
        return result.getValue() == null ? null
                : JSON.parseObject(((JSONObject) result.getValue()).toJSONString(), cls);
    }


    /**
     * 解析 Result 对象中的 List 类型数据
     */
    public static <T> List<T> parseListValue(Result result, Class<T> cls) {
        if (result.getCode() != RetCode.SUCCESS) {
            throw new ServiceException(result.getMessage());
        }
        return result.getValue() == null ? null : JSON.parseArray(((JSONArray) result.getValue()).toJSONString(), cls);
    }


    /**
     * 提取 Result 对象中的分页的列表数据 PageVO.data
     */
    public static <T> List<T> parsePageValue(Result result, Class<T> cls) {
        if (result.getCode() != RetCode.SUCCESS) {
            throw new ServiceException(result.getMessage());
        }

        if (result.getValue() == null) {
            return null;
        }

        List<T> ret = new ArrayList<>();

        List data = Objects.requireNonNull(ResultUtil.parseValue(result, PageVO.class)).getData();

        data.stream().forEach((Object obj) -> {
            JSONObject jObj = (JSONObject) obj;
            T item = JSON.parseObject(jObj.toJSONString(), cls);
            ret.add(item);
        });

        return ret;
    }
}
